package com.cloud.nacosConfigLoad;

import java.io.IOException;
import java.nio.file.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 监听指定目录下 `.class` 文件的变化（创建、修改、删除）
 */
public class ClassFileWatcher {

    private final Path watchPath;

    // 构造方法，传入要监听的目录路径
    public ClassFileWatcher(String directoryPath) {
        this.watchPath = Paths.get(directoryPath);
    }

    /**
     * 启动文件监控，并在文件发生变化时触发回调
     *
     * @param callback 变化时的回调方法
     */
    public void startWatching(FileChangeCallback callback) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.submit(() -> {
            try (WatchService watchService = watchPath.getFileSystem().newWatchService()) {
                // 注册目录，监听创建、修改和删除事件
                watchPath.register(watchService,
                        StandardWatchEventKinds.ENTRY_CREATE,
                        StandardWatchEventKinds.ENTRY_MODIFY,
                        StandardWatchEventKinds.ENTRY_DELETE);

                System.out.println("Monitoring directory: " + watchPath);

                // 持续监听文件变化
                while (true) {
                    WatchKey watchKey = watchService.take(); // 阻塞直到有变化
                    // 遍历所有发生的事件
                    for (WatchEvent<?> event : watchKey.pollEvents()) {
                        // 如果变化的文件是 .class 文件
                        if (event.context().toString().endsWith(".class")) {
                            System.out.println("Class file changed: " + event.context());
                            callback.onFileChange(event.context().toString()); // 调用回调方法处理变化
                        }
                    }
                    watchKey.reset(); // 重置 WatchKey，继续监听
                }
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        });
    }

    // 回调接口，当文件变化时触发
    public interface FileChangeCallback {
        void onFileChange(String fileName);
    }
}
